/*
 * LogAdmin.java
 *
 */
package servlets;

import dbUtil.*;
import beans.*;
import utils.*;
import iteradores.*;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author 
 * @version
 */
public class LogAdmin extends HttpServlet {

    private IteradorUsuario usuarioActual;

    /**
     * Initializes the servlet.
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    /**
     * Destroys the servlet.
     */
    @Override
    public void destroy() {
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String url = null;
        ServletContext scon = getServletContext();
        PrintWriter out = response.getWriter();
        int op = 0;
        String str_op = request.getParameter("op");

        //Se obtiene la operacion: 0 --> LOGIN; 1 --> LOGOUT
        if ((str_op != null) && (str_op.length() > 0)) {
            op = Integer.parseInt(request.getParameter("op"));
        }

        DBConfig dc = this.getDataBaseConfig();

        usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");
        url = "admin.jsp";

        try {
            switch (op) {
                case 0:
                    if (usuarioActual == null) {
                        url = this.user_login(dc, request, response);
                    }

                    break;

                case 1:
                    url = this.user_logout(dc, request, response);

                    break;
            }

            mostrar_pagina(url, request, response);
        } catch (Exception e) {
            e.printStackTrace(out);
        }
    }

    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }

    public void mostrar_pagina(String url, HttpServletRequest req, HttpServletResponse resp) throws Exception {
        RequestDispatcher disp = req.getRequestDispatcher(url);

        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Pragma", "no-cache");
        resp.setIntHeader("Expires", 0);
        disp.forward(req, resp);
    }

    public DBConfig getDataBaseConfig() {
        ServletContext scon = getServletContext();
        DBConfig dc = new DBConfig();

        dc.setDbname(scon.getInitParameter("dbname"));
        dc.setServer(scon.getInitParameter("dbserver"));
        //dc.setUser(scon.getInitParameter("dbuser"));
        //dc.setPass(scon.getInitParameter("dbpass"));

        return dc;
    }

    public String user_login(DBConfig dc, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url;
        String action = request.getParameter("action");

        if ((action != null) && action.equalsIgnoreCase("do")) {
            String username = request.getParameter("username");
            String password = request.getParameter("password");

            url = "login.jsp?msg=FAIL";

            if ((username != null) && (username.length() > 0) && (password != null) && (password.length() > 0)) {
                MD5 pass = new MD5(password);
                
                dc.setUser(username);
                dc.setPass(pass.getMD5());

                Connection con = BD.getCon(dc);
                Usuario user = new Usuario();

                user.setCon(con);
                user.setNombreUsuario(username);             

                user.setContrasenha(pass.getMD5());
                user.load_data();

                IteradorUsuario it = (IteradorUsuario) user.getIterator();

                if (it.getCantidad() > 0) {
                    it.getReset();
                    it.getNext();
                    //Objeto iterador que contendrá los menus del usuario
                    MenuUsuario menu = new MenuUsuario(it.getIdUsuario());
                    menu.setCon(con);

                    //Traemos todos los menús a los que puede acceder el usuario
                    menu.load_menu_usuario();
                    //Obtenemos su iterador
                    IteradorMenuUsuario ite = (IteradorMenuUsuario) menu.getIterator();

                    //ite.getReset();
                    //ite.getNext();
                    //Seteamos en la sesión el iterador de los menús.
                    request.setAttribute("menuUsuario", ite);
                    request.getSession().setAttribute("menuUsuario", ite);


                    it.getReset();
                    it.getNext();
                    // Seteamos en la sesion los datos del usuario
                    request.getSession().setAttribute("usuarioActual", it);

                    /*
                    // Seteamos en la sesion la configuracion de este usuario
                    // para las conexiones a la base de datos
                    ServletContext scon = getServletContext();
                    DBConfig       dc2  = new DBConfig();
                    
                    dc2.setDbname(scon.getInitParameter("dbname"));
                    dc2.setServer(scon.getInitParameter("dbserver"));
                    
                    dc2.setUser(scon.getInitParameter("dbuser"));
                    dc2.setPass(scon.getInitParameter("pass"));
                    
                    request.getSession().setAttribute("dc", dc2);*/
                    request.getSession().setAttribute("ConexionBd", con);

                    // Debemos mostrar el url correspondiente al menu de opciones

                    url = "admin.jsp";
                } else {
                    con.close();
                }
            }
        } else {
            url = "login.jsp";
        }

        return url;
    }

    public String user_logout(DBConfig dc, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "login.jsp?msg=LOGOUT";

        request.getSession().removeAttribute("usuarioActual");
        request.getSession().removeAttribute("ConexionBd");
        request.getSession().removeAttribute("menuUsuario");
        request.getSession().invalidate();

        return url;
    }
}
